package Chat;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import javax.swing.SwingUtilities;

public class ChatClient extends UnicastRemoteObject implements ClientService {

	private static final long serialVersionUID = 1L;

	private ChatService server;
	private ChatGUI cgui;
	private String user;

	public ChatClient(final String user) throws RemoteException, AlreadyBoundException {
		super();
		this.user = user;
		
		//Referenz auf das Stub-Objekt aus der Registry holen
		try {
			server = (ChatService) Naming.lookup("rmi://localhost/server");

		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {

			e.printStackTrace();
		} catch (RemoteException e) {

			e.printStackTrace();
		}


		//Registrierung des Remote-Objektes mit Namensangabe als URL
		try {
			Naming.bind("rmi://localhost/" + user, this); //Benutzername darf nur einmalig im Chat existieren
		} catch (MalformedURLException e2) {
			e2.printStackTrace();
		}

		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				cgui = new ChatGUI(server, user);

				// Wird der Chat geschlossen, so wird der User automatisch ausgeloggt.
				cgui.addWindowListener(new WindowAdapter() {
					public void windowClosing(WindowEvent e) {
						try {
							server.logout(user);
						} catch (RemoteException e1) {
							e1.printStackTrace();
						}
					}
				});

			}
		});

		server.login(user);

	}

	//Methode, um etwas an den Client zu senden
	public void send(final String s) throws RemoteException {
		// Wird an showMessage weitergereicht, wo der String dann an die Ausgabe
		// des Chatfensters angehängt wird.
		try {
			SwingUtilities.invokeLater(new Runnable() {

				@Override
				public void run() {
					cgui.showMessage(s);

				}

			});

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String getName() throws RemoteException {
		return this.user;
	}

}
